package config

import "github.com/spf13/viper"

type config struct {
	Viper *viper.Viper
}

func New() *config {
	var c config

	c.Viper = viper.New()
	c.Viper.SetConfigName(defaultName) //defaultName := lib.AppName()
	c.Viper.SetConfigType(defaultConfigType)
	c.Viper.AddConfigPath(defaultPath)

	return &c
}

func NewConfig(name, suffix, path string) *config {
	var c config

	c.Viper = viper.New()
	c.Viper.SetConfigName(name) //defaultName := lib.AppName()
	c.Viper.SetConfigType(suffix)
	c.Viper.AddConfigPath(path)

	return &c
}

func (c *config) Load() error {
	return c.Viper.ReadInConfig()
}

func (c *config) Store() error {
	err := c.Viper.SafeWriteConfig()
	if err != nil {
		err = c.Viper.WriteConfig()
	}
	return err
}

func (c *config) Register(module, key string, value any) {
	c.Viper.SetDefault(module+"."+key, value)
}

func (c *config) GetBool(module, key string) bool {
	return c.Viper.GetBool(module + "." + key)
}

func (c *config) GetString(module, key string) string {
	return c.Viper.GetString(module + "." + key)
}

func (c *config) GetInt(module, key string) int {
	return c.Viper.GetInt(module + "." + key)
}

func (c *config) GetFloat(module, key string) float64 {
	return c.Viper.GetFloat64(module + "." + key)
}

func (c *config) GetStringSlice(module string, key string) []string {
	return c.Viper.GetStringSlice(module + "." + key)
}

func (c *config) Set(module, key string, value any) {
	c.Viper.Set(module+"."+key, value)
}

func (c *config) Unmarshal(value any, arr ...string) error {
	key := ""

	for _, s := range arr {
		if len(key) != 0 {
			key += "."
		}
		key += s
	}
	if len(key) != 0 {
		return c.Viper.UnmarshalKey(key, value)
	} else {
		return c.Viper.Unmarshal(value)
	}

}

func (c *config) ReadConfigAndFileExist() (bool, error) {
	if err := c.Viper.ReadInConfig(); err != nil {
		if _, ok := err.(viper.ConfigFileNotFoundError); ok {
			// 配置文件未找到
			return false, nil
		} else {
			// 其他错误
			return true, err
		}
	}
	return true, nil
}
